<html>
 <head>
  <meta charset="UTF-8">
 </head>
 <body>
  <h1 data-lake-id="vPHgO" id="vPHgO"><span data-lake-id="u1e57949b" id="u1e57949b">典型回答</span></h1>
  <p data-lake-id="ub30531ba" id="ub30531ba"><br></p>
  <p data-lake-id="uea76b2b5" id="uea76b2b5"><span data-lake-id="u1c30039f" id="u1c30039f">堆和栈是JVM中的两个区域，想要知道为什么要搞两个区域，其实只需要搞清楚他们的特点和用途之间区别是什么就行了。</span></p>
  <p data-lake-id="ua46fc40b" id="ua46fc40b"><span data-lake-id="ubd7eb746" id="ubd7eb746">​</span><br></p>
  <p data-lake-id="u57597a68" id="u57597a68"><span data-lake-id="u3d385f7a" id="u3d385f7a">堆是存储对象的区域，堆的大小可以根据需要随时调整，堆的管理有垃圾回收器进行，堆内存是多个线程之间共享的。</span></p>
  <p data-lake-id="u13c1f28e" id="u13c1f28e"><span data-lake-id="u780a54c0" id="u780a54c0">​</span><br></p>
  <p data-lake-id="u82802464" id="u82802464"><span data-lake-id="uba10502b" id="uba10502b">栈是每个线程独享的一块区域，用于方法调用、局部变量等的存储。</span></p>
  <p data-lake-id="u5055530f" id="u5055530f"><span data-lake-id="ue4eb6a74" id="ue4eb6a74">​</span><br></p>
  <p data-lake-id="u729f7407" id="u729f7407"><span data-lake-id="u79402459" id="u79402459">把这两者区分开的好处有以下几个：</span></p>
  <p data-lake-id="u5c4ad325" id="u5c4ad325"><span data-lake-id="u365dfbb9" id="u365dfbb9">​</span><br></p>
  <p data-lake-id="u57dabd6a" id="u57dabd6a"><span data-lake-id="u3d986167" id="u3d986167">首先因为他们的存储内容不同，</span><strong><span data-lake-id="u1f2b9d0e" id="u1f2b9d0e">可以分开管理</span></strong><span data-lake-id="ub9d0bbdd" id="ub9d0bbdd">。堆内存可以用垃圾回收器管理，栈内存可以靠编译器和虚拟机执行完成。</span></p>
  <p data-lake-id="u649f0913" id="u649f0913"><span data-lake-id="u9c50c838" id="u9c50c838">​</span><br></p>
  <p data-lake-id="u912612b0" id="u912612b0"><span data-lake-id="u41f3cc63" id="u41f3cc63">其次，可以做到不互相影响。独立开两个不同的区域，可以做到</span><strong><span data-lake-id="u0e50d2d8" id="u0e50d2d8">不互相影响</span></strong><span data-lake-id="u62d46ded" id="u62d46ded">。堆内存溢出不会影响到栈。栈溢出也不会影响到堆。</span></p>
  <p data-lake-id="ue1508b5e" id="ue1508b5e"><span data-lake-id="uc38a673b" id="uc38a673b">​</span><br></p>
  <p data-lake-id="ub5285208" id="ub5285208"><span data-lake-id="u67a22352" id="u67a22352">还有就是可以做到</span><strong><span data-lake-id="u67187e4d" id="u67187e4d">数据隔离</span></strong><span data-lake-id="u76353637" id="u76353637">，因为有了栈，就可以把一些线程独享的局部变量等内容放到栈上，可以做到更好的隔离。而共享的一些数据就可以放到堆上做统一管理。</span></p>
  <p data-lake-id="u203c81d1" id="u203c81d1"><span data-lake-id="ue4068d2e" id="ue4068d2e">​</span><br></p>
  <p data-lake-id="u309e3895" id="u309e3895"><strong><span data-lake-id="u4ffd73eb" id="u4ffd73eb">提升各自性能</span></strong><span data-lake-id="u56075bb8" id="u56075bb8">。栈上分配的效率很高，可以适合分配局部变量等，可以非常的高效。而堆上的内存分配及回收都会相对复杂。这样区分开可以做各自的优化，提升整体效率。</span></p>
  <p data-lake-id="u4c9c2aa1" id="u4c9c2aa1"><br></p>
 </body>
</html>